package main

import "fmt"

/**
总结：
	对于一个无缓冲的信道来说，必须同时运行两个“任务”，一个用于接收，一个用于发送。
	如果只有一个主线程，不管是先运行发送还是接收，都会形成死锁，因为另一个根本没有机会执行。
	怎么才能开两个线程，让它们同时跑起来呢？ 当然就是使用协程
**/

//这个函数接收一个信道作为参数，然后会往这个信道里写数据
func hello(ch chan string) {
	fmt.Println("准备往信道发送数据")
	ch <- "hi"
}

func main() {
	pipline := make(chan string)
	go hello(pipline) //再次强调，因为使用了go关键字创建了协程，这个hello函数会在协程里运行，所以这里不会阻塞
	//hello(pipline)// 如果把上一行的代码，替换成这样，就会形成死锁。因为尝试往信道里发送数据，然而又没有接收者。
	re := <-pipline //这里发生了阻塞，除非有协程向pipline写入数据，否则不会执行下一行代码。而 go hello(pipline) ，正好创建了个协程在写入数据。
	fmt.Println("接收到的数据是:", re)
	fmt.Println("main 结束") //
	//与 73协程.go 进行对比。本例的协程就会执行。因为读写信道，会发生一定的阻塞
}
